

#include <stdio.h>
#include <fcntl.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

#include <event2/event.h>

#define FIFO_NAME "/tmp/test.fifo"

// 读管道
void read_cb(evutil_socket_t fd, short waht, void *arg)
{
    char buf[100] = {0};
    int len = read(fd, buf, 100);

    printf("Read len = %d, buf = %s", len, buf);

    if (len == 0)       // 对方退出
    {
        event_base_loopbreak((struct event_base *)arg);
    }
}

int main(void)
{

    // 有名管道文件存在则删除
    unlink(FIFO_NAME);
    // 创建有名管道
    mkfifo(FIFO_NAME, 0666);
    // 打开有名管道
    int fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK);

    // 创建事件处理框架
    struct event_base *base = event_base_new();
    // 创建事件
    struct event *ev = event_new(base, fd, EV_READ | EV_PERSIST, read_cb, base);
    // 将事件添加到处理框架上
    event_add(ev, NULL);    
    // 开始时间循环
    event_base_dispatch(base);

    // 释放资源
    event_free(ev);
    event_base_free(base);
    close(fd);

    return 0;
}